package com.example.words;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

//singleton
@Database(entities = {Word.class},version = 5,exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
    private  static WordDatabase INSTANCE;
    static synchronized/*当有多个线程访问时，保证不会冲突，采用排队的方法*/ WordDatabase getDatabase(Context context){
        if(INSTANCE == null){
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),WordDatabase.class,"word_database")
                    //.fallbackToDestructiveMigration()  //破坏式的迁移，把原有的数据全部清空，生成新的一个数据库
                    .addMigrations(MIGRATION_4_5)  //需要自己创建迁移的策略
                    .build();
        }
        return INSTANCE;
    }
    public abstract WordDao getWordDao();

    static final Migration MIGRATION_4_5 = new Migration(4,5) {   //Migration()括号中就是版本几到版本
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE word ADD COLUMN chinese_invisible INTEGER NOT NULL DEFAULT 0");
        }
    };

    static final Migration MIGRATION_2_3 = new Migration(2,3) {   //Migration()括号中就是版本几到版本
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE word ADD COLUMN bar_data INTEGER NOT NULL DEFAULT 1");
        }
    };

//    由于SQLite不支持直接删除字段（SQL支持），所以想要删除字段较为复杂
//    1.创建一个新的数据库，只设定想要的字段
//    2.将旧数据库相应的数据赋值到新数据库
//    3.旧数据库删掉
//    4.新数据库改名代替旧数据库
    static final Migration MIGRATION_3_4 = new Migration(3,4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE word_temp(id INTEGER PRIMARY KEY NOT NULL,english_word TEXT,"+
                    "chinese_meaning TEXT)");            //创建一个新的表
            database.execSQL("INSERT INTO word_temp(id,english_word,chinese_meaning)"+
                    "SELECT id,english_word,chinese_meaning FROM word");      //将旧数据库相应数据赋值到新数据库
            database.execSQL("DROP TABLE word");          //旧数据库删掉
            database.execSQL("ALTER TABLE word_temp RENAME to word");         //新数据库改名代替旧数据库
        }
    };
}
